/**
 * @description 扁平数组转树
 * @param idField 主键字段名 默认 id
 * @param parentField 父级主键字段名 默认 parentId
 * @param leafName 叶节点字段名 默认 isCamera
 * @param rootId 根节点父id 默认 1
 * @return {Array} 生成树状结构
 */
interface TreeNode {
	id: string;
	parentId: string | null;
	isCamera: number;
	childrens: TreeNode[];
	childs: TreeNode[];
	[key: string]: any;
}

interface Config {
	idField?: string;
	parentField?: string;
	rootId?: string;
	leafName?: string;
}

const arrayToTree = (items: TreeNode[], config: Config = {}): TreeNode[] => {
	if (!items || !items.length) {
		return [];
	}

	const currentConfig: Config = {
		idField: 'id',
		parentField: 'parentId',
		rootId: '1',
		leafName: 'isCamera',
		...config,
	};

	const lookup: { [key: string]: TreeNode } = {}; // 哈希表，用于快速查找节点
	const tree: TreeNode[] = []; // 存储最终的树结构

	// 遍历扁平数组，构建哈希表
	for (const item of items) {
		item.childrens = [];
		item.childs = [];

		const { [currentConfig.idField!]: id, [currentConfig.parentField!]: parentId } = item;

		// 如果当前元素是根节点（没有父节点），则直接添加到树数组中
		if (parentId === null || parentId === currentConfig.rootId) {
			tree.push(item);
		} else {
			// 如果父节点不存在于哈希表中，则先创建父节点
			if (!lookup[parentId]) {
				lookup[parentId] = { id: '', parentId: null, isCamera: 0, childrens: [], childs: [] } as TreeNode;
			}
			if (item[currentConfig.leafName!] === 1) {
				lookup[parentId].childs.push(item);
			} else {
				// 将当前节点添加到父节点的子节点数组中
				lookup[parentId].childrens.push(item);
			}
		}

		// 将当前节点添加到哈希表中，方便后续查找
		lookup[id] = item;
	}

	return tree;
};
export default arrayToTree;
